home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Camelot
/
Camelot 134 (1991-10)(Swedish User Group of Amiga)(SE)(PD)[WB].zip
/
Camelot 134 (1991-10)(Swedish User Group of Amiga)(SE)(PD)[WB].adf
/
RxSlides
/
setbits.a
< prev
Wrap
Text File
|
1990-03-08
|
1KB
|
57 lines
;------------------------------------------------------------------------
; setbits() -- set random bits in a plane
; part of the "dissolve" program from amicus
;-------------------------------------------------------------------------
;
; setbits( plane, maxbit, numbits )
; UBYTE *plane;
; unsigned long maxbit;
; unsigned int numbits;
CSECT text
XDEF _setbits
XREF _rand_mask,_rand_val
;register useage: d5 - max bit # to set, d4 - random generator mask
; d3 - current random value, d2 - byte offset in array for bit
; d2 - bit # to set, d1 - loop counter
_setbits equ *
movem.l d2-d5,-(a7)
move.l 20(a7),a0 ;get base address of array
move.l 24(a7),d5 ;get maxbit number
move.l 28(a7),d1 ;get # of bits to set
move.l _rand_mask,d4
move.l _rand_val,d3
move.l #0,d0 ;clear ret val for not finished
subq #1,d1
loop
lsr.l #1,d3 ;rand_val >>= 1;
bhi ok ;bif not 0 || no carry
xor
eor.l d4,d3 ;rand_val ^= rand_mask;
ok
cmp.l d5,d3 ;if( rand_val > maxbit )
bls setbit ;go set the bit if ok
bra loop
setloop
lsr.l #1,d3 ;do the shift
bls xor ;bif need to do the exculsive or
setbit
move.l d3,d2 ;copy to temp reg
lsr.l #3,d2 ;make it a byte offset
bset d3,0(a0,d2.l) ;set the bit in the array
dbne d1,setloop ;end if bit is already set || # of bits done
beq ret
move.l #1,d0 ;set ret val for finished
ret
move.l d3,_rand_val ;save new random value
movem.l (a7)+,d2-d5
rts
end